/*
 * JsonHandler.cpp
 *
 *  Created on: 2024年7月22日
 *      Author: zkswe
 */

#include <misc/JsonHandler.h>
#include "utils/JsonHelper.h"

#define IS_JSON_OBJ(json, obj) \
	if (!json.isObject()) { \
		LOGD("Json is not an object"); \
		return false; \
	} \
	if (!json.isMember(obj)) { \
		LOGD("Object %s not found in json", obj.c_str()); \
		return false; \
	} 

#define GET_INT_MEMBER(json, obj, val) \
	if (json[obj].isInt()) { \
		val = json[obj].asInt(); \
	} else { \
		LOGD("Object %s is not an integer", obj.c_str()); \
		return false; \
	} 

#define GET_STRING_MEMBER(json, obj, val) \
	if (json[obj].isString()) { \
		val = json[obj].asString(); \
	} else { \
		LOGD("Object %s is not a string", obj.c_str()); \
		return false; \
	} 

#define GET_BOOL_MEMBER(json, obj, val) \
	if (json[obj].isBool()) { \
		val = json[obj].asBool(); \
	} else { \
		LOGD("Object %s is not a boolean", obj.c_str()); \
		return false; \
	} 


// 从文件加载 JSON 数据
bool JsonHandler::loadFromFile(const std::string& filename) {
    // 调用 JsonHelper 的静态方法读取 JSON 文件，并将数据存储到成员变量 data 中
    return JsonHelper::readJsonFile(filename.c_str(), data);
}

bool JsonHandler::loadFromFile() {
    // 调用 JsonHelper 的静态方法读取 JSON 文件，并将数据存储到成员变量 data 中
    return JsonHelper::readJsonFile(filename.c_str(), data);
}

// 将当前 JSON 数据保存到文件
void JsonHandler::saveToFile(const std::string& filename) {
    // 调用 JsonHelper 的静态方法写入 JSON 文件
    if (JsonHelper::writeJsonFile(filename.c_str(), data)) {
        // 如果写入成功，记录日志
        LOGD("Data saved to %s", filename.c_str());
    } else {
        // 如果写入失败，记录错误日志
        LOGD("Error opening file for writing %s", filename.c_str());
    }
}

// 将指定的 JSON 数据保存到文件
void JsonHandler::saveToFile(const std::string& filename, const Json::Value& value) {
    // 创建输出文件流
    std::ofstream outputFile(filename);
    if (outputFile.is_open()) {
        // 将 JSON 数据写入文件
        outputFile << value;
        outputFile.close();
        // 记录日志
        LOGD("Data saved to %s", filename.c_str());
    } else {
        // 如果文件打开失败，记录错误日志
        LOGD("Error opening file for writing %s", filename.c_str());
    }
}

// 向 JSON 数组中添加数据
void JsonHandler::addDataToArray(const Json::Value& value) {
    // 使用 Json::Value 的 append 方法将值追加到数组
    data.append(value);
}

// 从 JSON 数组中移除指定索引的数据
void JsonHandler::removeDataFromArray(int index) {
    // 检查索引是否在有效范围内
    if (index >= 0 && index < (int)data.size()) {
        // 移除指定索引的数据
        data.removeIndex(index, &data[data.size()]);
    } else {
        // 如果索引无效，记录日志
        LOGD("Index out of range");
    }
}

// 获取 JSON 数组中指定索引的数据
Json::Value JsonHandler::getDataFromArray(int index) {
    // 检查索引是否在有效范围内
    if (index >= 0 && index < (int)data.size()) {
        // 返回指定索引的数据
        return data[index];
    } else {
        // 如果索引无效，记录日志并返回空的 Json::Value
        LOGD("Index out of range");
        return Json::Value();
    }
}

// 获取 JSON 数组的大小
int JsonHandler::getArraySize() {
    // 返回 JSON 数组的大小
    return data.size();
}

// 获取根节点的 JSON 数据
Json::Value JsonHandler::getRoot() {
    // 返回成员变量 data（即根节点）
    return data;
}

// 解析 JSON 字符串
const bool JsonHandler::parseJson(const std::string& jsonData, Json::Value& val) {
    Json::Reader reader;
    // 使用 Json::Reader 解析 JSON 字符串
    if (false == reader.parse(jsonData, val, false)) {
        // 如果解析失败，记录日志
        LOGD("--%d-- --%s-- 解析失败！！\n", __LINE__, __FILE__);
        return false;
    }
    // 解析成功，返回 true
    return true;
}

// 获取 JSON 对象中的整数值
const bool JsonHandler::getObjInt(const Json::Value& json, const std::string& obj, int& val) {
    // 检查 JSON 对象是否存在指定成员
    IS_JSON_OBJ(json, obj);
    // 获取整数成员值
    GET_INT_MEMBER(json, obj, val);
    return true;
}

// 获取 JSON 对象中的字符串值
const bool JsonHandler::getObjString(const Json::Value& json, const std::string& obj, std::string& val) {
    // 检查 JSON 对象是否存在指定成员
    IS_JSON_OBJ(json, obj);
    // 获取字符串成员值
    GET_STRING_MEMBER(json, obj, val);
    return true;
}

// 获取 JSON 对象中的布尔值
const bool JsonHandler::getObjBool(const Json::Value& json, const std::string& obj, bool& val) {
    // 检查 JSON 对象是否存在指定成员
    IS_JSON_OBJ(json, obj);
    // 获取布尔成员值
    GET_BOOL_MEMBER(json, obj, val);
    return true;
}

// 获取 JSON 对象中的文本值（字符串）
const std::string JsonHandler::getText(const Json::Value& json, const std::string& obj) {
    std::string text;

    // 检查 JSON 是否为对象类型
    if (true == json.isObject()) {
        // 判断成员是否存在
        if (true == json.isMember(obj)) {
            // 判断成员是否为字符串类型
            if (true == json[obj].isString()) {
                text = json[obj].asString();
            } else if (false == json[obj].isNull()) {
                // 如果成员不是字符串类型且不为空，记录日志
                LOGD("--%d-- --%s-- %s不是string！！\n%s\n", __LINE__, __FILE__, obj.c_str(), json.toStyledString().c_str());
            }
        } else {
            // 如果成员不存在，记录日志
            LOGD("--%d-- --%s-- %s成员不存在！！\n%s\n", __LINE__, __FILE__, obj.c_str(), json.toStyledString().c_str());
        }
    } else {
        // 如果 JSON 不是对象类型，记录日志
        LOGD("--%d-- --%s-- %s不是对象！！\n", __LINE__, __FILE__, json.toStyledString().c_str());
    }

    // 返回获取到的文本值
    return text;
}

// 设置文件名
void JsonHandler::setFilename(const std::string& newFilename) {
    filename = newFilename;
}

// 获取当前文件名
const std::string& JsonHandler::getFilename() const {
    return filename;
}

// 保存整数到 JSON 文件
void JsonHandler::saveInt(const std::string& key, int value) {
    data[key] = value; // 将整数值存储到 JSON 对象中
    saveToFile(filename);      // 保存到文件
}

// 获取整数从 JSON 文件
int JsonHandler::getInt(const std::string& key, int defaultValue) {
    if (!data.isMember(key) || !data[key].isInt()) {

        return defaultValue;
    }
    return data[key].asInt();
}

// 保存布尔值到 JSON 文件
void JsonHandler::saveBool(const std::string& key, bool value) {
    data[key] = value; // 将布尔值存储到 JSON 对象中
    saveToFile(filename);      // 保存到文件
}

// 获取布尔值从 JSON 文件
bool JsonHandler::getBool(const std::string& key, bool defaultValue) {
    if (!data.isMember(key) || !data[key].isBool()) {
        return defaultValue;
    }
    return data[key].asBool();
}
